package com.zyg.manager.service.impl;

import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zyg.common.utils.PageUtils;
import com.zyg.common.utils.Query;

import com.zyg.manager.dao.ContentDao;
import com.zyg.manager.entity.ContentEntity;
import com.zyg.manager.service.ContentService;


@Service("contentService")
public class ContentServiceImpl extends ServiceImpl<ContentDao, ContentEntity> implements ContentService {

    //定义一个常量作为key
    private final String KEY = "contentList";

    @Autowired
    private StringRedisTemplate redisTemplate;

    @Override
    public PageUtils queryPage(Map<String, Object> params) {
        IPage<ContentEntity> page = this.page(
                new Query<ContentEntity>().getPage(params),
                new QueryWrapper<ContentEntity>()
        );

        return new PageUtils(page);
    }

    /**
     * 作者：LMY
     * 功能 第一次查询时候存数据到入redis缓存
     * 时间：2021/11/1 23:32
     */
    public List<ContentEntity> findAll() {
        //1. 申明一个空集合
        List<ContentEntity> contentEntities = null;
        //2. 拿到String数据类型操作对象
        ValueOperations<String, String> stringOption = redisTemplate.opsForValue();
        //3. 从rdeis缓存中取出数据
        String contentList = stringOption.get(KEY);
        //3. 非空判断
        if(StrUtil.isNotBlank(contentList)){  //如果有数据，赋值给contentEntities
            System.out.println("走Redis缓存咯..........");
            contentEntities = JSON.parseArray(contentList,ContentEntity.class);
        }else {  //如果没有数据，数据库中查询出来，存入redis，再赋值给contentEntities
            System.out.println("走数据库查询咯..........");
            contentEntities = this.list();
            // 集合转换为json串
            String s = JSON.toJSONString(contentEntities);
            // 将json字符串串存放到数据库中，设置存储实际为10个小时
            redisTemplate.opsForValue().set("contentList",s,10, TimeUnit.HOURS);
        }
        //4. 返回数据
        return contentEntities;
    }
    /**
     * 作者：LMY
     * 功能：修改, 增删改操作都先清除key对应的缓存，保证缓存中的数据和数据库同步
     * 时间：2021/11/2 0:06
     */
    @Override
    public void update(ContentEntity content) {
       // redisTemplate.delete(KEY);
        this.updateById(content);
    }
    /**
     * 作者：LMY
     * 功能：添加
     * 时间：2021/11/2 0:06
     */
    @Override
    public void add(ContentEntity content) {
        //redisTemplate.delete(KEY);
        this.save(content);
    }
    /**
     * 作者：LMY
     * 功能：删除
     * 时间：2021/11/2 0:06
     */
    @Override
    public void delete(List<Long> asList) {
       // redisTemplate.delete(KEY);
        this.removeByIds(asList);
    }


}